package main

import "fmt"

// 第九章 结构体

type Qi struct {
	Name   string
	Age    int
	Sex    bool
	Hobbys []string
	Home   // 简写 可以通过 .Home.P 访问 // 也可以直接 .P访问
	// Homes Home 非简写
}

type Home struct {
	P string
}

// 结构体声明函数 可加 * 也可不加 函数名 参数 返回值
func (q *Qi) Song(name string) (restr string) {
	restr = "顶顶顶顶顶顶顶顶顶顶"
	fmt.Printf("\n %v唱了一首%v,观众觉得%v \n", q.Name, name, restr)
	return restr
}

// 结构体 Home 函数
func (h *Home) Go() {
	fmt.Println("Home******回家**********")
}

// 结构体
func demo9() {
	fmt.Println("*********************结构体*********************")
	fmt.Println("********************* 声明结构体 方式1 *********************")
	// 声明结构体 方式1
	var qm Qi
	qm.Age = 28
	qm.Name = "迭代"
	fmt.Println(qm)

	fmt.Println("********************* 声明结构体 方式2 *********************")
	// 声明结构体 方式2
	qm2 := Qi{"qi", 68, true, []string{"篮球", "足球", "乒乓球"}, Home{"北京"}}
	fmt.Println(qm2)

	// 声明结构体 方式3 不需要理会顺序
	fmt.Println("********************* 声明结构体 方式3 *********************")
	q := Qi{Name: "qi", Age: 18, Sex: true, Home: Home{P: "北京"}, Hobbys: []string{"篮球", "足球", "乒乓球"}}
	fmt.Println(q, q.Name)
	ret := q.Song("月亮之上")
	fmt.Printf("返回的值：%s \n", ret)
	q.Home.Go()

	fmt.Println("********* 声明结构体 方式4 ***************")
	qm3 := new(Qi)
	qm3.Name = "奇妙"
	fmt.Println(qm3.Name)

	var qmp *Qi
	qmp = &q
	qmp.Name = "修改了"
	(*qmp).Name = "ddddddddd" // *qmp返回的是指针 (*qmp).Name才可以拿到
	fmt.Println(q.Name, qmp.Name)
}
